package com.tiance.demo.service.mysql.analyzer;

import com.tiance.demo.service.mysql.utils.ByteUtils;
import com.tiance.demo.service.mysql.bo.FileHeader;

public class FileHeaderAnalyzer {

    public static String getHexStringOf(FileHeader fileHeader) {
        byte[] bytes = fileHeader.getBytes();
        return ByteUtils.bytes2HexStr(bytes);
    }

    public static FileHeader analyse(byte[] bytes) {
        FileHeader fileHeader = new FileHeader();
        fileHeader.setBytes(bytes);

        analyzeSpaceOrChksum(fileHeader);
        analyzeOffset(fileHeader);
        analyzePrev(fileHeader);
        analyzeNext(fileHeader);
        analyzeLsn(fileHeader);
        analyzeType(fileHeader);
        analyzeFileFlushLsn(fileHeader);
        analyzeArchLogNoOrSpaceId(fileHeader);

        return fileHeader;
    }

    private static void analyzeSpaceOrChksum(FileHeader fileHeader) {
        byte[] bytes = new byte[4];
        System.arraycopy(fileHeader.getBytes(), 0, bytes, 0, 4);

        String checkSum = ByteUtils.bytes2HexStr(bytes);
        fileHeader.setSpaceOrChksum(checkSum);
    }

    private static void analyzeOffset(FileHeader fileHeader) {
        byte[] bytes = new byte[4];
        System.arraycopy(fileHeader.getBytes(), 4, bytes, 0, 4);

        int offset = ByteUtils.bytes2Int(bytes);
        fileHeader.setOffset(offset);
    }

    private static void analyzePrev(FileHeader fileHeader) {
        byte[] bytes = new byte[4];
        System.arraycopy(fileHeader.getBytes(), 8, bytes, 0, 4);

        int prev = ByteUtils.bytes2Int(bytes);
        fileHeader.setPrev(prev);
    }

    private static void analyzeNext(FileHeader fileHeader) {
        byte[] bytes = new byte[4];
        System.arraycopy(fileHeader.getBytes(), 12, bytes, 0, 4);

        int next = ByteUtils.bytes2Int(bytes);
        fileHeader.setNext(next);
    }

    private static void analyzeLsn(FileHeader fileHeader) {
        byte[] bytes = new byte[8];
        System.arraycopy(fileHeader.getBytes(), 16, bytes, 0, 8);

        String lsn = ByteUtils.bytes2HexStr(bytes);
        fileHeader.setLsn(lsn);
    }

    private static void analyzeType(FileHeader fileHeader) {
        byte[] bytes = new byte[2];
        System.arraycopy(fileHeader.getBytes(), 24, bytes, 0, 2);

        String type = ByteUtils.bytes2HexStr(bytes);
        fileHeader.setType(type);
    }

    private static void analyzeFileFlushLsn(FileHeader fileHeader) {
        byte[] bytes = new byte[8];
        System.arraycopy(fileHeader.getBytes(), 26, bytes, 0, 8);

        String fileFlushLsn = ByteUtils.bytes2HexStr(bytes);
        fileHeader.setFileFlushLsn(fileFlushLsn);
    }

    private static void analyzeArchLogNoOrSpaceId(FileHeader fileHeader) {
        byte[] bytes = new byte[4];
        System.arraycopy(fileHeader.getBytes(), 34, bytes, 0, 4);

        int archLogNoOrSpaceId = ByteUtils.bytes2Int(bytes);
        fileHeader.setArchLogNoOrSpaceId(archLogNoOrSpaceId);
    }
}
